home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / dev / lang / pcq12src.lzh / Runtime / Readers / readonechar.asm < prev    next >
Assembly Source File  |  1990-12-10  |  2KB  |  81 lines

  1.  
  2. *    ReadOneChar.asm (of PCQ Pascal runtime library)
  3. *    Copyright (c) 1989 Patrick Quaid
  4.  
  5.     XREF    _p%FillBuffer
  6.     XREF    _p%IOResult
  7.  
  8. *    ReadOneChar returns the current character in d0, without actually
  9. *    'eating' it.  If the file is interactive, this will cause a DOS
  10. *    read.  If we are at EOF, this will generate an error.
  11. *
  12.  
  13. *    Algorithm:
  14. *
  15. *    if INTERACTIVE then
  16. *        if CURRENT >= LAST then
  17. *        FillBuffer
  18. *    d0 := (CURRENT)
  19. *
  20.  
  21. *    On entry, a0 has the address of the file rec
  22. *    The character is returned in d0
  23.  
  24.     INCLUDE    "/FileRec.i"
  25.  
  26.     SECTION    PCQ_Runtime,CODE
  27.  
  28.     XDEF    _p%ReadOneChar
  29. _p%ReadOneChar
  30.  
  31.     tst.l    _p%IOResult        ; is IO OK?
  32.     bne    3$            ; if not, leave
  33.     tst.b    EOF(a0)            ; are we at eof?
  34.     bne    3$            ; if not, skip
  35.     tst.b    INTERACTIVE(a0)        ; is it interactive?
  36.     beq.s    2$
  37.     move.l    CURRENT(a0),a1        ; get current address
  38.     cmpa.l    LAST(a0),a1        ; past end?
  39.     blt.s    2$            ; if not, skip
  40.     move.l    a0,-(sp)        ; save a0 just in case
  41.     jsr    _p%FillBuffer        ; Fill the buffer
  42.     move.l    (sp)+,a0        ; restore
  43. 2$    move.l    CURRENT(a0),a1        ; get address of current char
  44.     move.b    (a1),d0            ; get the char
  45. 3$    rts
  46.  
  47. *    GetThatChar
  48. *    If you've checked the current character with ReadOneChar
  49. *    and you want to 'eat' it, you call this routine.  These
  50. *    two routines are used in the Text file input routines.
  51. *
  52. *    Algorithm:
  53. *
  54. *    CURRENT := CURRENT + 1
  55. *    if not INTERACTIVE then
  56. *        if CURRENT >= LAST then
  57. *        FillBuffer
  58. *
  59.  
  60. *    On entry this routine expects a0 to hold the address of the
  61. *    file record
  62.  
  63.     XDEF    _p%GetThatChar
  64. _p%GetThatChar
  65.  
  66.     tst.l    _p%IOResult        ; how's the IO system?
  67.     bne    1$            ; not well.  Better leave
  68.     move.l    CURRENT(a0),a1
  69.     adda.l    #1,a1            ; advance CURRENT
  70.     move.l    a1,CURRENT(a0)        ; save it
  71.     tst.b    INTERACTIVE(a0)        ; is it interactive ?
  72.     bne.s    1$            ; if so, skip
  73.     cmpa.l    LAST(a0),a1        ; past end?
  74.     blt.s    1$            ; if not, skip
  75.     movem.l    d0/a0,-(sp)        ; save the address & character
  76.     jsr    _p%FillBuffer        ; fill the buffer
  77.     movem.l    (sp)+,d0/a0        ; get them back
  78. 1$    rts
  79.  
  80.     END
  81.